// app.js
import store from './store/index'

App({
  onLaunch() {
    // 初始化云开发环境（如果使用云开发）
    if (!wx.cloud) {
      console.error('请使用 2.2.3 或以上的基础库以使用云能力')
    } else {
      wx.cloud.init({
        traceUser: true,
      })
    }

    // 全局数据
    this.globalData = {
      userInfo: null,
      systemInfo: null
    }

    // 获取系统信息
    wx.getSystemInfo({
      success: res => {
        this.globalData.systemInfo = res
      }
    })

    // 检查登录状态
    this.checkLoginStatus()
  },

  // 检查登录状态
  checkLoginStatus() {
    wx.checkSession({
      success: () => {
        //  session_key 未过期，并且在本生命周期内有效
        const userInfo = wx.getStorageSync('userInfo')
        if (userInfo) {
          this.globalData.userInfo = userInfo
          store.dispatch('user/updateUserInfo', userInfo)
        }
      },
      fail: () => {
        // session_key 已经失效，需要重新执行登录流程
        this.login()
      }
    })
  },

  // 登录
  login() {
    return new Promise((resolve, reject) => {
      wx.login({
        success: res => {
          // 发送 res.code 到后台换取 openId, sessionKey, unionId
          if (res.code) {
            // 调用登录接口
            wx.request({
              url: `${this.globalData.baseUrl}/api/login`,
              method: 'POST',
              data: {
                code: res.code
              },
              success: loginRes => {
                if (loginRes.data.code === 0) {
                  const userInfo = loginRes.data.data
                  wx.setStorageSync('userInfo', userInfo)
                  this.globalData.userInfo = userInfo
                  store.dispatch('user/updateUserInfo', userInfo)
                  resolve(userInfo)
                } else {
                  reject(loginRes.data.msg)
                }
              },
              fail: err => {
                reject(err)
              }
            })
          } else {
            reject('登录失败！' + res.errMsg)
          }
        },
        fail: err => {
          reject(err)
        }
      })
    })
  },

  // 获取全局store
  getStore() {
    return store
  }
})
